package ServerService;

import java.util.Scanner;

/*
工具类:处理各种情况下的用户输入,并能按照需求处理要求
*/

public class utility {
    private static Scanner input = new Scanner(System.in);

    /*
     * @return 1-5 读取键盘上的菜单输入必须为1-6的范围
     */
    public static char readMenuSelection() {
        char c;
        for (;;) {
            String str = readKeyboard(1, false);
            c = str.charAt(0);// 字符串转char类型
            if (c != '1' && c != '2' && c != '3' && c != '4' && c != '5' && c != '6') {
                System.out.println("输入有误,请重新输入");
            } else
                break;// 属于范围内就退出死循环

        }
        return c;

    }

    /*
     * 读取键盘上的一个字符
     * 
     * @return char
     */
    public static char readChar() {
        String str = readKeyboard(1, false);
        return str.charAt(0);
    }

    /*
     * 读取键盘上的一个字符,并设置默认值 直接回车返回默认值，否则返回输入的字符
     * 
     * @return char
     */
    public static char readChar(char defaultvalue) {
        String str = readKeyboard(1, true);
        return (str.length() == 0) ? defaultvalue : str.charAt(0);
    }

    /*
     * 读取键盘上的一个整形，长度小于2位
     * 
     * @return Int
     */
    public static int readInt() {
        int n;
        for (;;) {
            String str = readKeyboard(10, false);
            try {
                n = Integer.parseInt(str);
                break;
            } catch (NumberFormatException e) {
                // TODO: handle exception
                System.out.println("数字输入错误请重新输入");
            }

        }
        return n;
    }

    /*
     * 读取键盘上的一个整形，长度小于10位
     * 
     * @return Int
     */
    public static int readInt(int defaultvalue) {
        int n;
        for (;;) {
            String str = readKeyboard(10, true);
            if (str.equals("")) {
                return defaultvalue;
            }
            try {
                n = Integer.parseInt(str);
                break;
            } catch (NumberFormatException e) {
                // TODO: handle exception
                System.out.println("数字输入错误请重新输入");
            }

        }
        return n;
    }
      /*
     * 读取键盘上的一个浮点型，长度小于10位
     * 
     * @return Int
     */
    public static double readDouble(double defaultvalue) {
        double n;
        for (;;) {
            String str = readKeyboard(10, true);
            if (str.equals("")) {
                return defaultvalue;
            }
            try {
                n = Double.parseDouble(str);//将字符串转换为浮点型
                break;
            } catch (NumberFormatException e) {
                // TODO: handle exception
                System.out.println("数字输入错误请重新输入");
            }

        }
        return n;
    }

    /**
     * 功能：读取键盘输入的指定长度的字符串
     * 
     * @param limit 限制的长度
     * @return 指定长度的字符串
     */

    public static String readString(int limit) {
        return readKeyboard(limit, false);
    }

    /**
     * 功能：读取键盘输入的指定长度的字符串或默认值，如果直接回车，返回默认值，否则返回字符串
     * 
     * @param limit        限制的长度
     * @param defaultValue 指定的默认值
     * @return 指定长度的字符串
     */

    public static String readString(int limit, String defaultValue) {
        String str = readKeyboard(limit, true);
        return str.equals("") ? defaultValue : str;
    }

    /**
     * 功能：读取键盘输入的确认选项，Y或N 将小的功能，封装到一个方法中.
     * 
     * @return Y或N
     */
    public static char readConfirmSelection() {
        System.out.println("请输入你的选择(Y/N): 请小心选择");
        char c;
        for (;;) {// 无限循环
            // 在这里，将接受到字符，转成了大写字母
            // y => Y n=>N
            String str = readKeyboard(1, false).toUpperCase();
            c = str.charAt(0);
            if (c == 'Y' || c == 'N') {
                break;
            } else {
                System.out.print("选择错误，请重新输入：");
            }
        }
        return c;
    }

    /*
     * 如果输入为空,或者输入大于limit的长度 提示重新输入 用户没有任何输入的情况下,布尔值形参设置为false则会一直提示用户输入,为ture直接返回
     * 
     * @return
     */
    public static String readKeyboard(int limit, boolean blankReturn) {
        String line = "";

        // 判断有没有下一行
        while (input.hasNextLine()) {// hasNexline方法默认返回true等待用户输入
            line = input.nextLine();// 读取这一行

            // 用户没有输入任何数据
            if (line.length() == 0) {
                if (blankReturn)
                    return line; // 如果blankReture为true可以返回空串
                else
                    continue; // 否则提示输入
            }

            // 如果用户输入大于limit,提示重新输入。
            if (line.length() < 1 || line.length() > limit) {
                System.out.println("输入长度(不能大于" + limit + ")" + "请重新输入");
                continue;
            }
            break;
        }
        return line;

    }

}
